
package com;

import com.br.util.FonteConexoes;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.context.FacesContext;

@ManagedBean(name="pesqTabulacao")
@SessionScoped
public class PesqTabulacaoBean
{
    private Map<String, Object> produtos;

    private int idProdSelec = 0;

    private static final int anoInicial = 2009;

    private Map<String, Object> anos;

    private int anoSelec = 0;

    private Map<String, Object> meses;

    private int mesSelec = 0;

    /**
     * Código da mensagem a ser exibida.
     */
    private int msg = 0;

    private String msgAExibir = "";

    private final String msgErro = "É obrigatório definir valores para todos os parâmetros de pesquisa.";

    private final String msgAviso = "Não foram encontrados resultados para os parâmetros de busca especificados.";

    /**
     * Classe CSS a ser aplicada caso haja uma mensagem para o usuário.
     */
    private String estiloMsg = "erro";

    // ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.
//    @Resource(name="jdbc/hermesweb") private DataSource dataSource;

    /**
     * Retorna mapa com produtos e seus respectivos índices. Por se tratar
     * de um TreeMap, os produtos serão exibidos em ordem alfabética.
     *
     */
    public Map<String, Object> getProdutos()
    {
        obterProdutos();
        return produtos;
    }
    
    public int getIdProdSelec()
    {
        return idProdSelec;
    }

    public Map<String, Object> getAnos()
    {
        obterAnos();
        return anos;
    }

    public int getAnoSelec()
    {
        return anoSelec;
    }

    public Map<String, Object> getMeses()
    {
        obterMeses();
        return meses;
    }

    public int getMesSelec()
    {
        return mesSelec;
    }

    public String getEstiloMsg()
    {
        msgAExibir = "erro";

        if (msg == 1)
        {
            // mensagem de erro a exibir
            estiloMsg = "erro";
        }
        else if (msg == 2)
        {
            // mensagem de aviso a exibir
            estiloMsg = "aviso";
        }

        return estiloMsg;
    }

    public int getMsg()
    {
        return msg;
    }

    public String getMsgAExibir()
    {
        msgAExibir = "";

        if (msg == 1)
        {
            // mensagem de erro a exibir
            estiloMsg = "erro";
            msgAExibir = msgErro;
        }
        else if (msg == 2)
        {
            // mensagem de aviso a exibir
            estiloMsg = "aviso";
            msgAExibir = msgAviso;
        }

        return msgAExibir;
    }

    public void setIdProdSelec(int idProdSelec)
    {
        this.idProdSelec = idProdSelec;
    }

    public void setAnoSelec(int anoSelec)
    {
        this.anoSelec = anoSelec;
    }

    public void setMesSelec(int mesSelec)
    {
        this.mesSelec = mesSelec;
    }

    public void setMsg(int msg)
    {
        this.msg = msg;
    }

    /**
     * Popula o Map anos com os valores possíveis para esse campo.
     */
    private void obterAnos()
    {
        // determinando o ano atual
        Date dataAtual = new Date();
        GregorianCalendar gregCalendario = new GregorianCalendar();
        gregCalendario.setTime(dataAtual);
        int anoFinal = gregCalendario.get(GregorianCalendar.YEAR);

        anos = new LinkedHashMap<String, Object>();

        // item padrão, que nos indica não haver nenhum item selecionado pelo usuário
        anos.put("Selecione o ano", 0);

        for (int ano = anoInicial; ano <= anoFinal; ano++)
        {
            anos.put(String.valueOf(ano), ano);
        }
    }

    /**
     * Popula o Map meses com os valores possíveis para esse campo.
     */
    private void obterMeses()
    {
        meses = new LinkedHashMap<String, Object>();

        // item padrão, que nos indica não haver nenhum item selecionado pelo usuário
        meses.put("Selecione o mês", 0);

        meses.put("Janeiro", 1);
        meses.put("Fevereiro", 2);
        meses.put("Março", 3);
        meses.put("Abril", 4);
        meses.put("Maio", 5);
        meses.put("Junho", 6);
        meses.put("Julho", 7);
        meses.put("Agosto", 8);
        meses.put("Setembro", 9);
        meses.put("Outubro", 10);
        meses.put("Novembro", 11);
        meses.put("Dezembro", 12);
    }

    // ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.

    private void obterProdutos()
    {
        try
        {
            Connection conexao = null;
            try {
                conexao = new FonteConexoes().getConnection();
            } catch (Exception e) {
                throw new SQLException(e.getMessage());
            }

            
            try
            {
                Statement stmt = conexao.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT id_prod, nome_prod FROM produtos"
                        + " WHERE status_prod = 'a' ORDER BY nome_prod");

                produtos = new LinkedHashMap<String, Object>();

                // item padrão, que nos indica não haver nenhum item selecionado pelo usuário
                produtos.put("Selecione o produto", 0);

                while (rs.next() == true)
                {
                    // vamos adicionando cada um dos produtos recuperados do banco
                    // (com seu respectivo índice) ao TreeMap
                    String nomeAtual = rs.getString(2);
                    int indiceAtual = rs.getInt(1);
                    produtos.put(nomeAtual, indiceAtual);
                }
            }
            finally
            {
                conexao.close();
            }
        }
        catch(SQLException sqle)
        {
            // houve exceção SQL; redirecionamos para a página de erro interno
            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler =
                    (ConfigurableNavigationHandler)context.getApplication().getNavigationHandler();
            handler.performNavigation("erro?faces-redirect=true");
        }
    }

    public String efetuarPesquisa()
    {
        String resultado = "pesqTabulacao";

        if (idProdSelec == 0 || anoSelec == 0 || mesSelec == 0)
        {
            resultado = "pesqTabulacao?msg=1&faces-redirect=true";
        }
        else
        {
            resultado = "tabulacoes?idProd=" + idProdSelec + "&ano=" + anoSelec
                    + "&mes=" + mesSelec + "&faces-redirect=true";

            // os comboBox devem estar na posição inicial para uma próxima
            // exibição de pesqTabulacao.xhtml nesta mesma seção
            idProdSelec = 0;
            anoSelec = 0;
            mesSelec = 0;
        }

        return resultado;
    }
}
